package edu.northwestern.cbits.purple_robot_manager.probes.builtin;
import java.security.SecureRandom;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import edu.northwestern.cbits.purple_robot_manager.R;
import edu.northwestern.cbits.purple_robot_manager.logging.LogManager;
import edu.northwestern.cbits.purple_robot_manager.probes.Probe;
public class RandomNoiseProbe extends Probe
{
private static final String NOISE_VALUE = "NOISE_VALUE";
public static final String ACTION = "purple_robot_generate_noise";
private static final boolean DEFAULT_ENABLED = false;
private static final boolean DEFAULT_PERSIST = false;
private static final String ENABLED = "config_probe_random_noise_enabled";
private static final String PERSIST = "config_probe_random_noise_persist";
private PendingIntent _intent = null;
public static RandomNoiseProbe instance = null;
@Override
public String getPreferenceKey() {
return "built_in_random_noise";
}
@Override
public String name(Context context)
{
return "edu.northwestern.cbits.purple_robot_manager.probes.builtin.RandomNoiseProbe";
}
@Override
public String title(Context context)
{
return context.getString(R.string.title_random_noise_probe);
}
@Override
public String probeCategory(Context context)
{
return context.getResources().getString(R.string.probe_misc_category);
}
@Override
public void enable(Context context)
{
SharedPreferences prefs = Probe.getPreferences(context);
Editor e = prefs.edit();
e.putBoolean(RandomNoiseProbe.ENABLED, true);
e.commit();
}
@Override
public void disable(Context context)
{
SharedPreferences prefs = Probe.getPreferences(context);
Editor e = prefs.edit();
e.putBoolean(RandomNoiseProbe.ENABLED, false);
e.commit();
}
@Override
public boolean isEnabled(Context context)
{
if (RandomNoiseProbe.instance == null)
RandomNoiseProbe.instance = this;
SharedPreferences prefs = Probe.getPreferences(context);
if (super.isEnabled(context))
{
if (prefs.getBoolean(RandomNoiseProbe.ENABLED, RandomNoiseProbe.DEFAULT_ENABLED))
{
synchronized (this)
{
Bundle bundle = new Bundle();
bundle.putString("PROBE", this.name(context));
bundle.putDouble("TIMESTAMP", ((double) System.currentTimeMillis()) / 1000);
SecureRandom random = new SecureRandom();
bundle.putFloat(RandomNoiseProbe.NOISE_VALUE, random.nextFloat());
bundle.putBoolean("TRANSMIT", prefs.getBoolean(RandomNoiseProbe.PERSIST, RandomNoiseProbe.DEFAULT_PERSIST));
this.transmitData(context, bundle);
if (this._intent == null)
{
this._intent = PendingIntent.getService(context, 0, new Intent(RandomNoiseProbe.ACTION), PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 250, this._intent);
}
}
return true;
}
else if (this._intent != null)
{
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.cancel(this._intent);
this._intent = null;
}
}
return false;
}
@Override
public String summarizeValue(Context context, Bundle bundle)
{
double noise = bundle.getDouble(RandomNoiseProbe.NOISE_VALUE);
return String.format(context.getResources().getString(R.string.summary_random_noise_probe), noise);
}
@Override
public String summary(Context context)
{
return context.getString(R.string.summary_random_noise_probe_desc);
}
@Override
@SuppressWarnings("deprecation")
public PreferenceScreen preferenceScreen(final Context context, PreferenceManager manager)
{
PreferenceScreen screen = super.preferenceScreen(context, manager);
screen.setTitle(this.title(context));
screen.setSummary(R.string.summary_random_noise_probe_desc);
CheckBoxPreference enabled = new CheckBoxPreference(context);
enabled.setTitle(R.string.title_enable_probe);
enabled.setKey(RandomNoiseProbe.ENABLED);
enabled.setDefaultValue(RandomNoiseProbe.DEFAULT_ENABLED);
screen.addPreference(enabled);
CheckBoxPreference persist = new CheckBoxPreference(context);
persist.setTitle(R.string.title_probe_random_noise_persist);
persist.setSummary(R.string.summary_probe_random_noise_persist);
persist.setKey(RandomNoiseProbe.PERSIST);
screen.addPreference(persist);
persist.setDefaultValue(RandomNoiseProbe.DEFAULT_PERSIST);
return screen;
}
@Override
public Map<String, Object> configuration(Context context)
{
Map<String, Object> map = super.configuration(context);
SharedPreferences prefs = Probe.getPreferences(context);
map.put(RandomNoiseProbe.PERSIST, prefs.getBoolean(RandomNoiseProbe.PERSIST, false));
return map;
}
@Override
public void updateFromMap(Context context, Map<String, Object> params)
{
super.updateFromMap(context, params);
if (params.containsKey(RandomNoiseProbe.PERSIST))
{
Object retain = params.get(RandomNoiseProbe.PERSIST);
if (retain instanceof Boolean)
{
SharedPreferences prefs = Probe.getPreferences(context);
Editor e = prefs.edit();
e.putBoolean(RandomNoiseProbe.PERSIST, (Boolean) retain);
e.commit();
}
}
}
@Override
public JSONObject fetchSettings(Context context)
{
JSONObject settings = super.fetchSettings(context);
try
{
JSONArray values = new JSONArray();
values.put(true);
values.put(false);
JSONObject enabled = new JSONObject();
enabled.put(Probe.PROBE_TYPE, Probe.PROBE_TYPE_BOOLEAN);
enabled.put(Probe.PROBE_VALUES, values);
JSONObject persist = new JSONObject();
persist.put(Probe.PROBE_TYPE, Probe.PROBE_TYPE_BOOLEAN);
persist.put(Probe.PROBE_VALUES, values);
settings.put(RandomNoiseProbe.PERSIST, persist);
}
catch (JSONException e)
{
LogManager.getInstance(context).logException(e);
}
return settings;
}
public String assetPath(Context context)
{
return "random-noise-probe.html";
}
}